<!DOCTYPE html>
            
<HTML>
<HEAD>
<meta name="booktitle" content="Developing Applications With Objective Caml" >
 <meta charset="ISO-8859-1"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<META name="GENERATOR" content="hevea 1.05-7 of 2000-02-24">
<META NAME="Author" CONTENT="Christian.Queinnec@lip6.fr">
<LINK rel=stylesheet type="text/css" href="videoc-ocda.css">
<script language="JavaScript" src="videoc.js"><!--
//--></script>
<TITLE>
 Exercises
</TITLE>
</HEAD>
<BODY class="regularBody">
<A HREF="book-ora040.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora042.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
<HR>

<H2> Exercises</H2><A NAME="toc57"></A>
<H3> Binary Trees</H3>
<A NAME="exo-arbre-imp"></A> 
We represent binary trees in the form of vectors. If a tree <I>a</I> has
height <I>h</I>, then the length of the vector will be 2<SUP><FONT SIZE=2>(<I>h</I>+1)</FONT></SUP>-1. If a
node has position <I>i</I>, then the left subtree of this node lies in the
interval of indices [<I>i</I>+1 , <I>i</I>+1+2<SUP><FONT SIZE=2><I>h</I></FONT></SUP>], and its right subtree lies in
the interval [<I>i</I>+1+2<SUP><FONT SIZE=2><I>h</I></FONT></SUP>+1 , 2<SUP><FONT SIZE=2>(<I>h</I>+1)</FONT></SUP>-1]. This representation is
useful when the tree is almost completely filled. The type
<I>'a</I> of labels for nodes in the tree is assumed to contain a
special value indicating that the node does not exist. Thus, we
represent labeled trees by the by vectors of type <I>'a array</I>.<BR>
<BR>
<OL type=1>
<LI>
 Write a <A id="a134__1_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('1_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 1,APPEND/C-Stylescor.ml.tex,CSabfa -->function</SPAN></A> , taking as input a 
binary <A id="a135__2_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('2_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 2,APPEND/C-Stylescor.ml.tex,CSabtype -->tree</SPAN></A> of type <I>'a bin_tree</I>  
<!-- POPUP DEFINITION -->
<layer id="l__1_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","1_APPEND/C-Stylescor.ml.tex","");
//--></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>fill_array<CODE> </CODE>tree<CODE> </CODE>tab<CODE> </CODE>empty<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>aux<CODE> </CODE>i<CODE> </CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>function</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Empty<CODE> </CODE>-&gt;<CODE> </CODE>tab<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>empty<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>Node<CODE> </CODE><TT>(</TT>l<CODE>,</CODE>e<CODE>,</CODE>r<TT>)</TT><CODE> </CODE>-&gt;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>tab<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>e<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>aux<CODE> </CODE><TT>(</TT>i<CODE>+</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><TT>(</TT>p<CODE>/</CODE><CODE>2</CODE><TT>)</TT><CODE> </CODE>l<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>aux<CODE> </CODE><TT>(</TT>i<CODE>+</CODE>p<TT>)</TT><CODE> </CODE><TT>(</TT>p<CODE>/</CODE><CODE>2</CODE><TT>)</TT><CODE> </CODE>r<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE>aux<CODE> </CODE><CODE>0</CODE><CODE> </CODE><TT>(</TT><TT>(</TT><TT>(</TT>Array.length<CODE> </CODE>tab<TT>)</TT><CODE>+</CODE><CODE>1</CODE><TT>)</TT><CODE>/</CODE><CODE>2</CODE><TT>)</TT><CODE> </CODE>tree<CODE> </CODE>;;<BR><CODE>val fill_array : 'a bin_tree -&gt; 'a array -&gt; 'a -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("1_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<!-- POPUP DEFINITION -->
<layer id="l__2_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","2_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>type</B><CODE> </CODE><I>'a</I><CODE> </CODE>bin_tree<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Empty<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>Node<CODE> </CODE><B>of</B><CODE> </CODE><I>'a</I><CODE> </CODE>bin_tree<CODE> </CODE><CODE>*</CODE><CODE> </CODE><I>'a</I><CODE> </CODE><CODE>*</CODE><CODE> </CODE><I>'a</I><CODE> </CODE>bin_tree<CODE> </CODE>;;<BR><CODE>type 'a bin_tree = | Empty | Node of 'a bin_tree * 'a * 'a bin_tree</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("2_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script>(defined on page <A HREF="book-ora016.html#par-arbre-bin">??</A>) and an array (which one assumes
to be large enough). The function stores the labels contained in the
tree in the array, located according to the discipline described
above. 
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a function to create a <A id="a136__3_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('3_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 3,APPEND/C-Stylescor.ml.tex,CSableaf -->leaf</SPAN></A> (tree of 
height 0). <!-- POPUP DEFINITION -->
<layer id="l__3_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","3_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>leaf<CODE> </CODE>empty<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>[|</CODE><CODE> </CODE>empty<CODE> </CODE><CODE>|]</CODE><CODE> </CODE><CODE> </CODE>;;<BR><CODE>val leaf : 'a -&gt; 'a array = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("3_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a <A id="a137__4_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('4_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 4,APPEND/C-Stylescor.ml.tex,CSabnode -->function</SPAN></A> to construct a new tree 
from a label and two other trees. 
<!-- POPUP DEFINITION -->
<layer id="l__4_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","4_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>node<CODE> </CODE>elt<CODE> </CODE>left<CODE> </CODE>right<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>ll<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Array.length<CODE> </CODE>left<CODE> </CODE><B>and</B><CODE> </CODE>lr<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Array.length<CODE> </CODE>right<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>l<CODE> </CODE><CODE>=</CODE><CODE> </CODE>max<CODE> </CODE>ll<CODE> </CODE>lr<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>res<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Array.create<CODE> </CODE><TT>(</TT><CODE>2</CODE><CODE>*</CODE>l<CODE>+</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE>elt<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>Array.blit<CODE> </CODE>left<CODE> </CODE><CODE>0</CODE><CODE> </CODE>res<CODE> </CODE><CODE>1</CODE><CODE> </CODE>ll<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>Array.blit<CODE> </CODE>right<CODE> </CODE><CODE>0</CODE><CODE> </CODE>res<CODE> </CODE><TT>(</TT>ll<CODE>+</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE>lr<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>res<CODE> </CODE><CODE> </CODE>;;<BR><CODE>val node : 'a -&gt; 'a array -&gt; 'a array -&gt; 'a array = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("4_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a conversion <A id="a138__5_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('5_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 5,APPEND/C-Stylescor.ml.tex,CSabconv -->function</SPAN></A> from the type  
<I>'a bin_tree</I> to an array.
<!-- POPUP DEFINITION -->
<layer id="l__5_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","5_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>make_array<CODE> </CODE>empty<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>function</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>Empty<CODE> </CODE>-&gt;<CODE> </CODE>leaf<CODE> </CODE>empty<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>Node<CODE> </CODE><TT>(</TT>l<CODE>,</CODE>e<CODE>,</CODE>r<TT>)</TT><CODE> </CODE>-&gt;<CODE> </CODE>node<CODE> </CODE>e<CODE> </CODE><TT>(</TT>make_array<CODE> </CODE>empty<CODE> </CODE>l<TT>)</TT><CODE> </CODE><TT>(</TT>make_array<CODE> </CODE>empty<CODE> </CODE>r<TT>)</TT><CODE> </CODE>;;<BR><CODE>val make_array : 'a -&gt; 'a bin_tree -&gt; 'a array = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("5_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Define an infix traversal <A id="a139__6_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('6_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 6,APPEND/C-Stylescor.ml.tex,CSabinf -->function</SPAN></A> for these 
trees. 
<!-- POPUP DEFINITION -->
<layer id="l__6_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","6_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>infix<CODE> </CODE>tab<CODE> </CODE>empty<CODE> </CODE>f<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>aux<CODE> </CODE>i<CODE> </CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>tab<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE>&lt;&gt;</CODE>empty<CODE> </CODE><B>then</B><CODE> </CODE><TT>(</TT><CODE> </CODE>aux<CODE> </CODE><TT>(</TT>i<CODE>+</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><TT>(</TT>p<CODE>/</CODE><CODE>2</CODE><TT>)</TT><CODE> </CODE>;<CODE> </CODE>f<CODE> </CODE>tab<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE> </CODE>;<CODE> </CODE>aux<CODE> </CODE><TT>(</TT>i<CODE>+</CODE>p<TT>)</TT><CODE> </CODE><TT>(</TT>p<CODE>/</CODE><CODE>2</CODE><TT>)</TT><CODE> </CODE><TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE>aux<CODE> </CODE><CODE>0</CODE><CODE> </CODE><TT>(</TT><TT>(</TT><TT>(</TT>Array.length<CODE> </CODE>tab<TT>)</TT><CODE>+</CODE><CODE>1</CODE><TT>)</TT><CODE>/</CODE><CODE>2</CODE><TT>)</TT><CODE> </CODE>;;<BR><CODE>val infix : 'a array -&gt; 'a -&gt; ('a -&gt; 'b) -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("6_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Use it to <A id="a140__7_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('7_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 7,APPEND/C-Stylescor.ml.tex,CSabaff -->display</SPAN></A> the tree.  
<!-- POPUP DEFINITION -->
<layer id="l__7_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","7_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>print_tab_int<CODE> </CODE>tab<CODE> </CODE>empty<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>infix<CODE> </CODE>tab<CODE> </CODE>empty<CODE> </CODE><TT>(</TT><B>fun</B><CODE> </CODE>x<CODE> </CODE>-&gt;<CODE> </CODE>print_int<CODE> </CODE>x<CODE> </CODE>;<CODE> </CODE>print_string<CODE> </CODE><CODE>" - "</CODE><TT>)</TT><CODE> </CODE>;;<BR><CODE>val print_tab_int : int array -&gt; int -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("7_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> What can you say about <A id="a141__8_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('8_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 8,APPEND/C-Stylescor.ml.tex,CSabpref -->prefix</SPAN></A> traversal  
of these trees?
<!-- POPUP DEFINITION -->
<layer id="l__8_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","8_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 Prefix traversal of the tree corresponds to left-to-right traversal of
the array.


<PRE><BR># <B>let</B><CODE> </CODE>prefix<CODE> </CODE>tab<CODE> </CODE>empty<CODE> </CODE>f<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>for</B><CODE> </CODE>i<CODE>=</CODE><CODE>0</CODE><CODE> </CODE><B>to</B><CODE> </CODE><TT>(</TT>Array.length<CODE> </CODE>tab<TT>)</TT><CODE>-</CODE><CODE>1</CODE><CODE> </CODE><B>do</B><CODE> </CODE><B>if</B><CODE> </CODE>tab<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE>&lt;&gt;</CODE>empty<CODE> </CODE><B>then</B><CODE> </CODE>f<CODE> </CODE>tab<CODE>.</CODE><TT>(</TT>i<TT>)</TT><CODE> </CODE><B>done</B><CODE> </CODE>;;<BR><CODE>val prefix : 'a array -&gt; 'a -&gt; ('a -&gt; unit) -&gt; unit = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("8_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></OL><A NAME="toc58"></A>
<H3> Spelling Corrector</H3> <A NAME="exo-ortho"></A> The exercise uses
the <A id="a142__9_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('9_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 9,APPEND/C-Stylescor.ml.tex,CScodef -->lexical tree</SPAN></A> , from the exercise of chapter 
<A HREF="index.html#chap-PF">2</A>, page <A HREF="book-ora020.html#exo-arbrlex">??</A>, to build a spelling
corrector.<BR>
<BR>
<OL type=1>
<LI>  Construct a dictionary from a file in ASCII in
which each line contains one word. For this, one will write a
<A id="a143__10_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('10_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 10,APPEND/C-Stylescor.ml.tex,CScolire -->function</SPAN></A> which takes a file name as argument and returns the 
corresponding dictionary. <!-- POPUP DEFINITION -->
<layer id="l__9_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","9_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>type</B><CODE> </CODE>noeud_lex<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Lettre<CODE> </CODE><B>of</B><CODE> </CODE>char<CODE> </CODE><CODE>*</CODE><CODE> </CODE>bool<CODE> </CODE><CODE>*</CODE><CODE> </CODE>arbre_lex<CODE> </CODE><BR><CODE> </CODE><B>and</B><CODE> </CODE>arbre_lex<CODE> </CODE><CODE>=</CODE><CODE> </CODE>noeud_lex<CODE> </CODE><CODE> </CODE>list;;<BR><CODE>type noeud_lex = | Lettre of char * bool * arbre_lex</CODE><BR><CODE>type arbre_lex = noeud_lex list</CODE><BR># <B>type</B><CODE> </CODE>mot<CODE> </CODE><CODE>=</CODE><CODE> </CODE>string;;<BR><CODE>type mot = string</CODE><BR># <B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE><CODE> </CODE>existe<CODE> </CODE>m<CODE> </CODE>d<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE><CODE> </CODE>aux<CODE> </CODE>sm<CODE> </CODE>i<CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>match</B><CODE> </CODE>d<CODE> </CODE><B>with</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>[]<CODE> </CODE>-&gt;<CODE> </CODE><B>false</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><TT>(</TT>Lettre<CODE> </CODE><TT>(</TT>c<CODE>,</CODE>b<CODE>,</CODE>l<TT>)</TT><TT>)</TT>::q<CODE> </CODE>-&gt;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>c<CODE> </CODE><CODE>=</CODE><CODE> </CODE>sm<CODE>.[</CODE>i<CODE>]</CODE><CODE> </CODE><B>then</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>1</CODE><CODE> </CODE><B>then</B><CODE> </CODE>b<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE>existe<CODE> </CODE><TT>(</TT>String.sub<CODE> </CODE>sm<CODE> </CODE><TT>(</TT>i<CODE>+</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><TT>(</TT>n<CODE>-</CODE><CODE>1</CODE><TT>)</TT><TT>)</TT><CODE> </CODE>l<CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE>existe<CODE> </CODE>sm<CODE> </CODE>q<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE>aux<CODE> </CODE>m<CODE> </CODE><CODE>0</CODE><CODE> </CODE><TT>(</TT>String.length<CODE> </CODE>m<TT>)</TT>;;<BR><CODE>val existe : string -&gt; arbre_lex -&gt; bool = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>ajoute<CODE> </CODE>m<CODE> </CODE>d<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>aux<CODE> </CODE>sm<CODE> </CODE>i<CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>0</CODE><CODE> </CODE><B>then</B><CODE> </CODE>d<CODE> </CODE><B>else</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>match</B><CODE> </CODE>d<CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>[]<CODE> </CODE>-&gt;<CODE> </CODE><CODE>[</CODE>Lettre<CODE> </CODE><TT>(</TT>sm<CODE>.[</CODE>i<CODE>],</CODE><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>1</CODE><CODE>,</CODE><CODE> </CODE>ajoute<CODE> </CODE><TT>(</TT>String.sub<CODE> </CODE>sm<CODE> </CODE><TT>(</TT>i<CODE>+</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><TT>(</TT>n<CODE>-</CODE><CODE>1</CODE><TT>)</TT><TT>)</TT><CODE> </CODE>[]<TT>)</TT><CODE>]</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><TT>(</TT>Lettre<TT>(</TT>c<CODE>,</CODE>b<CODE>,</CODE>l<TT>)</TT><TT>)</TT>::q<CODE> </CODE>-&gt;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>c<CODE> </CODE><CODE>=</CODE><CODE> </CODE>sm<CODE>.[</CODE>i<CODE>]</CODE><CODE> </CODE><B>then</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>1</CODE><CODE> </CODE><B>then</B><CODE> </CODE><TT>(</TT>Lettre<TT>(</TT>c<CODE>,</CODE><B>true</B><CODE>,</CODE>l<TT>)</TT><TT>)</TT>::q<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE>Lettre<TT>(</TT>c<CODE>,</CODE>b<CODE>,</CODE>ajoute<CODE> </CODE><TT>(</TT>String.sub<CODE> </CODE>sm<CODE> </CODE><TT>(</TT>i<CODE>+</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><TT>(</TT>n<CODE>-</CODE><CODE>1</CODE><TT>)</TT><TT>)</TT><CODE> </CODE>l<TT>)</TT>::q<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE><TT>(</TT>Lettre<TT>(</TT>c<CODE>,</CODE>b<CODE>,</CODE>l<TT>)</TT><TT>)</TT>::<TT>(</TT>ajoute<CODE> </CODE>sm<CODE> </CODE>q<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE>aux<CODE> </CODE>m<CODE> </CODE><CODE>0</CODE><CODE> </CODE><TT>(</TT>String.length<CODE> </CODE>m<TT>)</TT>;;<BR><CODE>val ajoute : string -&gt; arbre_lex -&gt; arbre_lex = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>verifie<CODE> </CODE>l<CODE> </CODE>d<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>match</B><CODE> </CODE>l<CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>[]<CODE> </CODE>-&gt;<CODE> </CODE>[]<BR><CODE> </CODE><CODE>|</CODE><CODE> </CODE>t::q<CODE> </CODE>-&gt;<CODE> </CODE><B>if</B><CODE> </CODE>existe<CODE> </CODE>t<CODE> </CODE>d<CODE> </CODE><B>then</B><CODE> </CODE>t::<TT>(</TT>verifie<CODE> </CODE>q<CODE> </CODE>d<TT>)</TT><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE>verifie<CODE> </CODE>q<CODE> </CODE>d<BR><CODE> </CODE>;;<BR><CODE>val verifie : string list -&gt; arbre_lex -&gt; string list = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE>string_of_char<CODE> </CODE>c<CODE> </CODE><CODE>=</CODE><CODE> </CODE>String.make<CODE> </CODE><CODE>1</CODE><CODE> </CODE>c;;<BR><CODE>val string_of_char : char -&gt; string = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>filter<CODE> </CODE>p<CODE> </CODE>l<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>match</B><CODE> </CODE>l<CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>[]<CODE> </CODE>-&gt;<CODE> </CODE>[]<BR><CODE> </CODE><CODE>|</CODE><CODE> </CODE>t::q<CODE> </CODE>-&gt;<CODE> </CODE><B>if</B><CODE> </CODE>p<CODE> </CODE>t<CODE> </CODE><B>then</B><CODE> </CODE>t::<TT>(</TT>filter<CODE> </CODE>p<CODE> </CODE>q<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE>filter<CODE> </CODE>p<CODE> </CODE>q;;<BR><CODE>val filter : ('a -&gt; bool) -&gt; 'a list -&gt; 'a list = &lt;fun&gt;</CODE><BR><BR><BR># <B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>selecte<CODE> </CODE>n<CODE> </CODE>d<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>match</B><CODE> </CODE>d<CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>[]<CODE> </CODE>-&gt;<CODE> </CODE>[]<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><TT>(</TT>Lettre<TT>(</TT>c<CODE>,</CODE>b<CODE>,</CODE>l<TT>)</TT><TT>)</TT>::q<CODE> </CODE>-&gt;<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>1</CODE><CODE> </CODE><B>then</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>filter<CODE> </CODE><TT>(</TT><B>function</B><CODE> </CODE>x<CODE> </CODE>-&gt;<CODE> </CODE>x<CODE> </CODE><CODE>&lt;&gt;</CODE><CODE> </CODE><CODE>"!"</CODE><TT>)</TT><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><TT>(</TT>List.map<CODE> </CODE><CODE> </CODE><TT>(</TT><B>function</B><CODE> </CODE><TT>(</TT>Lettre<TT>(</TT>c<CODE>,</CODE>b<CODE>,_</CODE><TT>)</TT><TT>)</TT><CODE> </CODE>-&gt;<CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>b<CODE> </CODE><B>then</B><CODE> </CODE>string_of_char<CODE> </CODE>c<CODE> </CODE><B>else</B><CODE> </CODE><CODE>"!"</CODE><TT>)</TT><CODE> </CODE>d<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>else</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>r<CODE> </CODE><CODE>=</CODE><CODE> </CODE>selecte<CODE> </CODE><TT>(</TT>n<CODE>-</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE>l<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>and</B><CODE> </CODE>r2<CODE> </CODE><CODE>=</CODE><CODE> </CODE>selecte<CODE> </CODE>n<CODE> </CODE>q<CODE> </CODE><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>pr<CODE> </CODE><CODE>=</CODE><CODE> </CODE>List.map<CODE> </CODE><TT>(</TT><B>function</B><CODE> </CODE>s<CODE> </CODE>-&gt;<CODE> </CODE><TT>(</TT>string_of_char<CODE> </CODE>c<TT>)</TT><CODE>^</CODE>s<TT>)</TT><CODE> </CODE>r<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE>pr<CODE>@</CODE>r2;;<BR><CODE>val selecte : int -&gt; arbre_lex -&gt; string list = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("9_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<!-- POPUP DEFINITION -->
<layer id="l__10_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","10_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>lire_fichier<CODE> </CODE>nom_fichier<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>dico<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE>[]<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>and</B><CODE> </CODE>canal<CODE> </CODE><CODE>=</CODE><CODE> </CODE>open_in<CODE> </CODE>nom_fichier<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>try</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><B>true</B><CODE> </CODE><B>do</B><CODE> </CODE>dico<CODE> </CODE><CODE>:=</CODE><CODE> </CODE>ajoute<CODE> </CODE><TT>(</TT>input_line<CODE> </CODE>canal<TT>)</TT><CODE> </CODE><CODE>!</CODE>dico<CODE> </CODE><B>done</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>failwith<CODE> </CODE><CODE>"cas impossible"</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>End_of_file<CODE> </CODE>-&gt;<CODE> </CODE>close_in<CODE> </CODE>canal<CODE> </CODE>;<CODE> </CODE><CODE>!</CODE>dico<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE> </CODE>x<CODE> </CODE>-&gt;<CODE> </CODE>close_in<CODE> </CODE>canal<CODE> </CODE>;<CODE> </CODE>raise<CODE> </CODE>x<CODE> </CODE><CODE> </CODE>;;<BR><CODE>val lire_fichier : string -&gt; arbre_lex = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("10_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a function <TT><A id="a144__11_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('11_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 11,APPEND/C-Stylescor.ml.tex,CScomots -->words</SPAN></A></TT> that takes a 
character string and constructs the list of words in this string. The
word separators are space, tab, apostrophe, and quotation marks.
<!-- POPUP DEFINITION -->
<layer id="l__11_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","11_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>mots<CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>est_sep<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>function</B><CODE> </CODE><CODE>' '</CODE><CODE>|</CODE><CODE>'\t'</CODE><CODE>|</CODE><CODE>'\''</CODE><CODE>|</CODE><CODE>'"'</CODE><CODE> </CODE>-&gt;<CODE> </CODE><B>true</B><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE> </CODE><CODE>_</CODE><CODE> </CODE>-&gt;<CODE> </CODE><B>false</B><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>res<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE>[]<CODE> </CODE><B>and</B><CODE> </CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE><TT>(</TT><TT>(</TT>String.length<CODE> </CODE>s<TT>)</TT><CODE>-</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE><CODE>!</CODE>p<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><CODE>!</CODE>p<CODE>&gt;=</CODE><CODE>0</CODE><CODE> </CODE><CODE>&amp;&amp;</CODE><CODE> </CODE>est_sep<CODE> </CODE>s<CODE>.[!</CODE>p<CODE>]</CODE><CODE> </CODE><B>do</B><CODE> </CODE>decr<CODE> </CODE>p<CODE> </CODE><B>done</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE>n<CODE> </CODE><CODE>:=</CODE><CODE> </CODE><CODE>!</CODE>p<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><TT>(</TT><CODE>!</CODE>n<CODE>&gt;=</CODE><CODE>0</CODE><TT>)</TT><CODE> </CODE><B>do</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><CODE>!</CODE>n<CODE>&gt;=</CODE><CODE>0</CODE><CODE> </CODE><CODE>&amp;&amp;</CODE><CODE> </CODE>not<CODE> </CODE><TT>(</TT>est_sep<CODE> </CODE>s<CODE>.[!</CODE>n<CODE>]</CODE><TT>)</TT><CODE> </CODE><B>do</B><CODE> </CODE>decr<CODE> </CODE>n<CODE> </CODE><CODE> </CODE><B>done</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>res<CODE> </CODE><CODE>:=</CODE><CODE> </CODE>String.sub<CODE> </CODE>s<CODE> </CODE><TT>(</TT><CODE> </CODE><CODE>!</CODE>n<CODE> </CODE><CODE>+</CODE><CODE>1</CODE><TT>)</TT><CODE> </CODE><TT>(</TT><CODE>!</CODE>p<CODE> </CODE><CODE>-</CODE><CODE> </CODE><CODE>!</CODE>n<TT>)</TT><CODE> </CODE>::<CODE> </CODE><CODE>!</CODE>res<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><CODE>!</CODE>n<CODE>&gt;=</CODE><CODE>0</CODE><CODE> </CODE><CODE>&amp;&amp;</CODE><CODE> </CODE>est_sep<CODE> </CODE>s<CODE>.[!</CODE>n<CODE>]</CODE><CODE> </CODE><B>do</B><CODE> </CODE>decr<CODE> </CODE>n<CODE> </CODE><B>done</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>p<CODE> </CODE><CODE>:=</CODE><CODE> </CODE><CODE>!</CODE>n<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>!</CODE>res<CODE> </CODE>;;<BR><CODE>val mots : string -&gt; string list = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("11_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a function <TT><A id="a145__12_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('12_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 12,APPEND/C-Stylescor.ml.tex,CScoverif -->verify</SPAN></A></TT> that takes 
a dictionary and a list of words, and returns the list of words that
do not occur in the dictionary. 
<!-- POPUP DEFINITION -->
<layer id="l__12_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","12_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>verifie<CODE> </CODE>dico<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>function</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>[]<CODE> </CODE>-&gt;<CODE> </CODE>[]<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>m::l<CODE> </CODE>-&gt;<CODE> </CODE><B>if</B><CODE> </CODE>existe<CODE> </CODE>m<CODE> </CODE>dico<CODE> </CODE><B>then</B><CODE> </CODE>verifie<CODE> </CODE>dico<CODE> </CODE>l<CODE> </CODE><B>else</B><CODE> </CODE>m::<TT>(</TT>verifie<CODE> </CODE>dico<CODE> </CODE>l<TT>)</TT><CODE> </CODE>;;<BR><CODE>val verifie : arbre_lex -&gt; string list -&gt; string list = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("12_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a function <TT><A id="a146__13_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('13_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 13,APPEND/C-Stylescor.ml.tex,CScoocc -->occurrences</SPAN></A></TT> that 
takes a list of words and returns a list of pairs associating each
word with the number of its occurrences.
<!-- POPUP DEFINITION -->
<layer id="l__13_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","13_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>ajoute<CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>function</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>[]<CODE> </CODE>-&gt;<CODE> </CODE><CODE>[</CODE><TT>(</TT>x<CODE>,</CODE><CODE>1</CODE><TT>)</TT><CODE>]</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><TT>(</TT><TT>(</TT>y<CODE>,</CODE>n<TT>)</TT><CODE> </CODE><B>as</B><CODE> </CODE>p<TT>)</TT>::l<CODE> </CODE>-&gt;<CODE> </CODE><B>if</B><CODE> </CODE>x<CODE>=</CODE>y<CODE> </CODE><B>then</B><CODE> </CODE><TT>(</TT>y<CODE>,</CODE>n<CODE>+</CODE><CODE>1</CODE><TT>)</TT>::l<CODE> </CODE><B>else</B><CODE> </CODE>p::<TT>(</TT>ajoute<CODE> </CODE>x<CODE> </CODE>l<TT>)</TT><CODE> </CODE>;;<BR><CODE>val ajoute : 'a -&gt; ('a * int) list -&gt; ('a * int) list = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>ajoute_liste<CODE> </CODE>ld<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>function</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>[]<CODE> </CODE>-&gt;<CODE> </CODE>ld<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>n::l<CODE> </CODE>-&gt;<CODE> </CODE><B>let</B><CODE> </CODE>res<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ajoute_liste<CODE> </CODE>ld<CODE> </CODE>l<CODE> </CODE><B>in</B><CODE> </CODE>ajoute<CODE> </CODE>n<CODE> </CODE>res<CODE> </CODE>;;<BR><CODE>val ajoute_liste : ('a * int) list -&gt; 'a list -&gt; ('a * int) list = &lt;fun&gt;</CODE><BR><BR># <B>let</B><CODE> </CODE>occurences<CODE> </CODE>l<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ajoute_liste<CODE> </CODE>[]<CODE> </CODE>l<CODE> </CODE>;;<BR><CODE>val occurences : 'a list -&gt; ('a * int) list = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("13_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a function <TT><A id="a147__14_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('14_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 14,APPEND/C-Stylescor.ml.tex,CScoort -->spellcheck</SPAN></A></TT> that 
takes a dictionary and the name of a file containing the text to
analyze. It should return the list of incorrect words, together with
their number of occurrences. 
<!-- POPUP DEFINITION -->
<layer id="l__14_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","14_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>orthographe<CODE> </CODE>dico<CODE> </CODE>nom<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>f<CODE> </CODE><CODE>=</CODE><CODE> </CODE>open_in<CODE> </CODE>nom<CODE> </CODE><CODE> </CODE><B>and</B><CODE> </CODE>res<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE>[]<CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>try</B><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>while</B><CODE> </CODE><B>true</B><CODE> </CODE><B>do</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE>input_line<CODE> </CODE>f<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>ls<CODE> </CODE><CODE>=</CODE><CODE> </CODE>mots<CODE> </CODE>s<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>lv<CODE> </CODE><CODE>=</CODE><CODE> </CODE>verifie<CODE> </CODE>dico<CODE> </CODE>ls<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>res<CODE> </CODE><CODE>:=</CODE><CODE> </CODE>ajoute_liste<CODE> </CODE><CODE>!</CODE>res<CODE> </CODE>lv<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>done</B><CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>failwith<CODE> </CODE><CODE>"cas impossible"</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>with</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>End_of_file<CODE> </CODE>-&gt;<CODE> </CODE>close_in<CODE> </CODE>f<CODE> </CODE>;<CODE> </CODE><CODE>!</CODE>res<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>x<CODE> </CODE>-&gt;<CODE> </CODE>close_in<CODE> </CODE>f<CODE> </CODE>;<CODE> </CODE>raise<CODE> </CODE>x<CODE> </CODE><CODE> </CODE>;;<BR><CODE>val orthographe : arbre_lex -&gt; string -&gt; (string * int) list = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("14_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></OL><A NAME="toc59"></A>
<H3> Set of Prime Numbers</H3>We would like now to construct the infinite set of prime numbers
(without calculating it completely) using lazy data structures. <BR>
<BR>
<OL type=1>
<LI>
 Define the <A id="a148__15_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('15_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 15,APPEND/C-Stylescor.ml.tex,CSeped -->predicate</SPAN></A> <TT>divisible</TT> 
which takes an integer and an initial list of prime numbers, and
determines whether the number is divisible by one of the integers on
the list.
<!-- POPUP DEFINITION -->
<layer id="l__15_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","15_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 On sait que si un nombre <I>x</I> poss�de un diviseur sup�rieur �
<I>x</I> alors il en poss�de inf�rieur � <I>x</I>. Nous nous
contentons donc de ne tester que les �l�ments de la liste qui sont
inf�rieurs � la racine carr�e de l'argument. 


<PRE><BR># <B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>est_divisible<CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>function</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>[]<CODE> </CODE>-&gt;<CODE> </CODE><B>false</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE>n::l<CODE> </CODE>-&gt;<CODE> </CODE><CODE> </CODE><TT>(</TT>x<CODE> </CODE><B>mod</B><CODE> </CODE>n<TT>)</TT><CODE>=</CODE><CODE>0</CODE><CODE> </CODE><CODE>||</CODE><CODE> </CODE><TT>(</TT><CODE> </CODE><TT>(</TT>n<CODE>*</CODE>n<CODE>&lt;=</CODE>x<TT>)</TT><CODE> </CODE><CODE>&amp;&amp;</CODE><CODE> </CODE><TT>(</TT>est_divisible<CODE> </CODE>x<CODE> </CODE>l<TT>)</TT><TT>)</TT><CODE> </CODE>;;<BR><CODE>val est_divisible : int -&gt; int list -&gt; bool = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("15_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Given an initial list of prime numbers, write the function
<TT><A id="a149__16_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('16_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 16,APPEND/C-Stylescor.ml.tex,CSepnext -->next</SPAN></A></TT> that returns the smallest number not 
on the list. 
<!-- POPUP DEFINITION -->
<layer id="l__16_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","16_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 On calcule le dernier �l�ment de la liste.


<PRE><BR># <B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>dernier<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>function</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>[]<CODE> </CODE>-&gt;<CODE> </CODE>failwith<CODE> </CODE><CODE>"liste vide"</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>[</CODE>x<CODE>]</CODE><CODE> </CODE>-&gt;<CODE> </CODE>x<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>_::</CODE>l<CODE> </CODE>-&gt;<CODE> </CODE>dernier<CODE> </CODE>l<CODE> </CODE>;;<BR><CODE>val dernier : 'a list -&gt; 'a = &lt;fun&gt;</CODE><BR>

</PRE>

On cherche le premier nombre premier � partir d'un certain entier en les 
testant de deux en deux. 


<PRE><BR># <B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>plus_petit_premier<CODE> </CODE>l<CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>est_divisible<CODE> </CODE>n<CODE> </CODE>l<CODE> </CODE><B>then</B><CODE> </CODE>plus_petit_premier<CODE> </CODE>l<CODE> </CODE><TT>(</TT>n<CODE>+</CODE><CODE>2</CODE><TT>)</TT><CODE> </CODE><B>else</B><CODE> </CODE>n<CODE> </CODE>;;<BR><CODE>val plus_petit_premier : int list -&gt; int -&gt; int = &lt;fun&gt;</CODE><BR>

</PRE>

Et on assemble.


<PRE><BR># <B>let</B><CODE> </CODE>suivant<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>function</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>[]<CODE> </CODE><CODE> </CODE>-&gt;<CODE> </CODE><CODE>2</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE>[</CODE><CODE>2</CODE><CODE>]</CODE><CODE> </CODE>-&gt;<CODE> </CODE><CODE>3</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>|</CODE><CODE> </CODE><CODE> </CODE>l<CODE> </CODE><CODE> </CODE>-&gt;<CODE> </CODE><B>let</B><CODE> </CODE>pg<CODE> </CODE><CODE>=</CODE><CODE> </CODE>dernier<CODE> </CODE>l<CODE> </CODE><B>in</B><CODE> </CODE>plus_petit_premier<CODE> </CODE>l<CODE> </CODE><TT>(</TT>pg<CODE>+</CODE><CODE>2</CODE><TT>)</TT><CODE> </CODE>;;<BR><CODE>val suivant : int list -&gt; int = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("16_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Define the value <I><A id="a150__17_APPEND/C-Stylescor.ml.tex" href="javascript: void showMessage('17_APPEND/C-Stylescor.ml.tex')" class="mousable"><SPAN style=""><!-- 17,APPEND/C-Stylescor.ml.tex,CSepens -->setprime</SPAN></A></I>  
representing the set of prime numbers, in the style of the type 
<I>'a enum</I> on page <A HREF="book-ora039.html#C-Styles-ens">??</A>. It will be useful for
this set to retain the integers already found to be prime.
<!-- POPUP DEFINITION -->
<layer id="l__17_APPEND/C-Stylescor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","17_APPEND/C-Stylescor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>type</B><CODE> </CODE><I>'a</I><CODE> </CODE>ens<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{<B>mutable</B><CODE> </CODE>i<CODE>:</CODE><I>'a</I><CODE> </CODE>;<CODE> </CODE>f<CODE> </CODE><CODE>:</CODE><CODE> </CODE><I>'a</I><CODE> </CODE>-&gt;<CODE> </CODE><I>'a</I><CODE> </CODE>}<CODE> </CODE>;;<BR><CODE>type 'a ens = { mutable i: 'a; f: 'a -&gt; 'a }</CODE><BR># <B>let</B><CODE> </CODE>next<CODE> </CODE>e<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>let</B><CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE>e<CODE>.</CODE>i<CODE> </CODE><B>in</B><CODE> </CODE>e<CODE>.</CODE>i<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE><TT>(</TT>e<CODE>.</CODE>f<CODE> </CODE>e<CODE>.</CODE>i<TT>)</TT><CODE> </CODE>;<CODE> </CODE>x<CODE> </CODE>;;<BR><CODE>val next : 'a ens -&gt; 'a = &lt;fun&gt;</CODE><BR>

</PRE>



<PRE><BR># <B>let</B><CODE> </CODE>ensprem<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>prec<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE><CODE>[</CODE><CODE>2</CODE><CODE>]</CODE><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>fonct<CODE> </CODE><CODE>_</CODE><CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>let</B><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE>suivant<CODE> </CODE><CODE>!</CODE>prec<CODE> </CODE><B>in</B><CODE> </CODE>prec<CODE> </CODE><CODE>:=</CODE><CODE> </CODE><CODE>!</CODE>prec<CODE> </CODE><CODE>@</CODE><CODE> </CODE><CODE>[</CODE>n<CODE>]</CODE><CODE> </CODE>;<CODE> </CODE><CODE> </CODE>n<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE>{<CODE> </CODE>i<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE>2</CODE><CODE> </CODE>;<CODE> </CODE>f<CODE> </CODE><CODE>=</CODE><CODE> </CODE>fonct<CODE> </CODE>}<CODE> </CODE>;;<BR><CODE>val ensprem : int ens = {i=2; f=&lt;fun&gt;}</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("17_APPEND/C-Stylescor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></OL><HR>
<A HREF="book-ora040.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora042.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
</BODY>
</HTML>
